home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1995 October
/
EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso
/
Aminet
/
dev
/
asm
/
Asm_Course2.lha
/
Teil06.TXT
< prev
next >
Wrap
Text File
|
1992-09-02
|
13KB
|
320 lines
A S S E M B L E R - K U R S (c) Jeff Kandle 1990
6.Teil...
So,leute...ich habe mal ein ganz klein bisschen pause gemacht..damit ich
nicht verroste, und ein paar effekte `gebaut`, die werde ich euch
warscheinlich beibringen.
Hmmmh, weiter mit dem raster....Wie gesagt werden wir erstmal das Ding von
demletzt bearbeiten. Und zwar in der Form, das es erstmal weicher wird, und
nicht so Flackert, und zweitens das wir mal ein Schwingen in die Sache
bringen.
Wie gesagt, es ist besser wenn ihr das ausgedruckt vor den Augen habt. Ich
kann zwar aus dem Kopf erzaehlen was geaendert werden muss, schliesslich
habe ich das ding ja Programmiert, aber ihr muesstet es schon sehen, denn
einfach nur tippen und starten is scheisse. Wenn einer aber absolut keine
Moeglichkeit hat, dem werde ich es zuschicken, ich glaube aber das jeder
irgendeinen kennt der Druckern kann.
Ja, pack mers Buam
So, das erste was wir aendern wollen ist das es weicher zieht. Das mit der
Verzoegerungsschleife is` wohl jedem Klar..Aber wir koennen auch auf etwas
anderes warten. Wir sollten da etwas nehmen was zuverlaessig immer an der
gleichen position abfragbar ist, und was immer in gleichen abstaeden
Passiert....
Die uhr...noe geht nicht...die schalten wir bei der Interrupt sperre direkt
mit aus..da tut sich nichts mehr.
Aber den Bildschirm, wir sind mit dem Prozessoer zwar nicht so gut dran wie
mit dem Copper, aber fuer eine Abfrage reicht es allemal.
Vorher muesste ihr aber noch wissen das es im oberen bildschirmbereich ein
paar Zeilen gibt indenen der Amiga und der Copper usw. nichts machen, dort
koennen wir uns hervorragend `Einklinken`, man nennt es den Vertikal
Blanking bereich....Wie fragen wir das aber ab ?
Nun wir haben im Amiga ein Schoenes register..es nennt sich VHposr und
liegt in $DFF006, wir koennen dort X- und Y-position des Rasterstrahls
abfragen, dazu brauchen wir aber einen neuen befehl.
Compare Kurz CMP
Um uns die sache leicht zu machen, vergleichen wir Direkt, das heisst Wert
mit Speicherstelle, und sieht dann so aus
Cmpi.B #$00,VHposr
Das i hinter dem Cmp befehl muss bei allen Befehlen eingegeben werden wenn
sie so Direct arbeiten. z.b. Addi, Subi usw.
Also koennen wir das schon mal anstelle der #$5000 wartreschhleife im
Source einfuegen ....
So, jetzt wollen wir uns mal mit der Routine fuer die Bewegung befassen.
Was macht sie Eigentlich...hmmm nicht viel, sie addiert die Positionen der
Wait befehle in der Copperliste nur das das naechste mal bis eine zeile
tiefer gewartet wird. Das macht sie mit `Add`.
Es waere aber nicht viel schwerer eine Tabelle anzufertigen, in der halt
eine menge positionen stehen, die man dann einfach ausliesst, und jeden
durchlauf ein weiteres element nimmt.
Is wohl klar oder ?
Also zur Technik...keine bange, ich mache das mit den Mitteln die euch
schon zur verfuegung stehen.
Wir machen uns erstmal eine Tabelle, anhand dieser tabelle kann ich die
weiteren Sachen die noetig sind viel besser erklaeren. Bei dem
Programmierstil ist es egal wieviele Elemente die tabelle hat, das
erleichter die sache ungemein.
Erstmal die Tabelle, sie besteht der einfachheit halber erstmal aus dem
Ganzen Wait-befehl Datum...Hinterher werden wir dann mit Bytes arbeiten,
und durch manipulation in der Bitebene, die sache auf die richtige position
bringen...Also, here she comes
Dc.w $500f,$500f,$500f,$500f,$510f,$510f,$510f,$520f,$520f,$530f,$540f
Dc.w $550f,$570f,$590f,$570f,$550f,$540f,$530f,$520f,$520f,$510f,$510f
Dc.w $510f,$500f,$500f,$500f,$500f,$500f
Wie ihr vielleicht seht hoert die tabelle so auf wie sie angefangen hat,
sie ist eine Cyklus-tabelle.
Sie soll ein Titschbewegung des Balkens hervorrufen.
So, um diese Bewegung zu ermoeglichen muessen wir jetzt nur noch jeden
bildschirm durchlauf eine neue position aus der tabelle nehmen..und schon
titscht das ding.
Also, wie koennten wir das machen...Wir nehmen am besten einen Indirekten
zeiger, setzen ihn auf das erste Element der Tabelle, und lassen ihn
durchlaufen, er holt sich dan das erste element..sobald das passiert ist
setzen wir den Zeiger auf das naechtse Element...u.s.w. sobald das letzte
Element erreicht ist setzen wir den zeiger einfach wieder auf das naechste
Element....Ja, das ist relativ einfach...aber Programmtechnisch schwerer
als mein Zweiter Vorschlag zu diesem thema.
Wir lesen `Bei Jedem` durchlauf immer der erste Element der Tabelle, und
bearbeiten es. Dann lassen wir die Tabelle Rotieren, indem wir das erste
Element irgendwo zwischen speichern, und das zweite Element an die Stelle
des Ersten setzen, dann das dritte an die Stelle des Zweiten usw. sobald
wir dann das letzte an die Stelle des vorletzten kopiert haben schreiben
wir das gerettete erste an die letzte position geschrieben haben, haben wir
die Tabelle rotieren lassen...Das hat den Vorteil wenn wir die tabelle von
mehreren stellen auslesen lassen, das wir nicht Hunderttausend zeiger
Stellen und abfragen muessen, denn das ist eine Menge aufwand...Jetzt kommt
das geaenderte listing....Die tabelle koennt ihr auch selber eingeben, ihr
muesst dann nur den Counter-wert im Programmsource auf Tabellenlaenge in
worten -2 worten stellen....
Execbase = 4
Openlibrary = -552
CIAapra = $BFE001
Cop1lc = $DFF080
Forbid = -132
Permit = -138
VHposr = $DFF006
Start: move.l Execbase,a6
jsr Forbid(a6)
clr.l d0
lea gfxname,a1
jsr Openlibrary(a6)
move.l d0,gfxbase
move.l #copperliste,Cop1lc
Vonvorne:
LEA COPPERLISTE,A0
LEA SINTABLE,a1
Wait: CMPI.B #$80,VHPOSR
BNE.S WAIT
MOVE.W 18(A1),d0
MOVE.W D0,4(a0)
ADD.W #$200,D0
MOVE.W D0,12(a0)
BSR.S TABLEROTATE
Btst #6,CIAapra
Bne.s vonvorne
Move.l gfxbase,a0
Move.l 38(a0),Cop1lc
Jsr Permit(a6)
Clr.l d0
Rts
Tablerotate:
Move.l #sintable,a2 ; Holt sich tabellenzeiger
Move.l a2,a3 ; zweiter zeiger nach a3
Add.l #2,a3 ; zweiter zeiger auf naechstes Element
Move.w #25,d0 ; Counter
Move.w (a2),a4 ; Erstes wort retten
roloop:
Move.w (a3)+,(a2)+
dbf d0,roloop
move.w a4,(a2) ; Erstes wort-> unten dran
rts
Gfxname: dc.b "graphics.library",0
even
Gfxbase: dc.l 0
Copperliste:
dc.w $0180,$0000
dc.w $200f,$fffe
dc.w $0180,$0f00
dc.w $220f,$fffe
dc.w $0180,$0000
copperlistenende:
dc.l $-2 ; ende der copperliste , -2 = $fffffffe
Sintable:
Dc.w $500f,$500f,$500f,$500f,$510f,$510f,$510f,$520f,$520f,$530f,$540f
Dc.w $550f,$570f,$590f,$570f,$550f,$540f,$530f,$520f,$520f,$510f,$510f
Dc.w $510f,$500f,$500f,$500f,$500f,$500f
Natuerlich koennt ihr das listing ausschneiden, oder ihr tippt einfach die
aenderungen in euer Grundprogramm ein, wie ihr es macht is egal..hauptsache
ihr habt es verstanden.
So, nachdem wir Copperlistenverwaltungen und Copperlisten manipulation
gelernt haben, koennten wir eigentlich weitergehen oder....
Wir verlassen jetzt mal wieder das kapitel `Manipulationen an der Laufenden
Copperliste`, und gehen weiter mit dem Copper....Wir werden jetzt ein paar
tolle sachen machen, und dann machen wir weiter mit den Effekten...Aber
glaubt mir....Mit ! Bild! im hintergrund sehen die Effekte nochmal so doll
aus....
10.Konvertierung von IFF-ILBM Dateien ins RAW-Format
Endlich...jetzt kommen wir mal zu einer Sache die nicht so viel mit
Maschinensprache zutun hat, dafuer aber um so mehr mit Intros und Demos.
Wir wollen naehmlich mal ein Bild auf den Bildschirm bringen...
Ich ueberlege mir gerade ob wir erst Malen oder erst das programm entwerfen
sollen......Hmmmm, ich wuerde sagen - malen wir erstmal.
O.k, Deluxepaint 3.0 ist schnell zur hand, oder wer Dpaint 3.21 hat ist
natuerlich besser dran, denn es hat eine Funktion die ich sehr zu schaetzen
weiss, naehmlich die Umschaltung PAL->NTSC.. Naja wir malen auf jeden Fall
im PAL-modus, und leider erstmal nur mit einer (2) farben, und im LO-RES
modus...Also Stellt im Dpaint Menu bitte alles dafuer ein...
Also, was ihr jetzt malt ist mir Wurscht...Hauptsache es gefaellt euch.
Wenn es fertig ist...abspeichern...Dpaint verlassen und rein in den
Kefrens-IFF-converter...was dahinten hat den noch einer nicht, kann ich mir
garnicht vorstellen...wenn das einer von sich auch sagen kann, schreibe er
mir bitte einen kleinen brief, ich werde ihm das teil dann in den
Briefkasten pumpen...
O.k...gehen wir mal davon aus das jeder den hat...
Starten..So jetzt seht ihr viele Knoepfe und so..ihr geht erstmal auf den,
auf dem `CD DF0:` und drueckt solange drauf bis dort das laufwerk steht auf
dem die Diskette mit `EUREM` bild liegt. Dann lasst ihr diesen in ruh.
Nun druecken auf `READ DIR`, ratter...ratter... jetzt liegt die Directory
in dem Klitzekleinen Fenster ober Rechts.
Die bedienung kennt ihr ja...klickt euer bild an, und geht auf `LOAD`
Nach kurzer Zeit muesste euer Bild auf dem Bildschirm erscheinen...Was ? es
ist nicht ganz drauf, fehlt ein stueck...dann benutzt mal die
Cursortasten..Schoen nicht.?
So jetzt gehen wir zum Konvertieren.
Ihr seht oben ein Kleines Knoepfchen `IFF-ILBM`..das ist ja das was ihr
eingeladen habt, drueckt da jetzt einmal drauf. Jetzt muesste da RAW-NORM`
stehen..gut !
Jetzt geht ihr auf das ding Daneben, da drueckt ihr drauf bis da `BEFORE`
steht. Es bezieht sich auf die Colormap, sie ist dafuer da damit man die
genauen farben des Bildes hat und sie nicht aus der Palette von Dpaint
abschreiben muss, toll was ?
So jetzt muesst ihr dem Bild, das jetzt schon konvertiert ist noch einen
neuen Namen geben, dazu geht ihr in das laengliche Fenster unter den
Koordinaten, Drueckt mit der Maus drauf, und gebt einen Namen ein.
Dann geht ihr nur noch auf `SAVE` und fertig seid ihr mit dem Konvertieren.
Ich wuerde euch gerne die ganzen funktionen dieses ganz fantastischen
konverters erklaeren, aber die sind alle sehr schwer zu verstehen, und es
hat erst sinn wenn ihr den Blitter kennt, und das dauert noch etwas.
So nachdem wir das Bild abgespeicher haben, muesste es genau 10244 bytes
lang sein, falls nicht habt ihr etwas falsch gemacht.....
Probiert es nochmal....
So nachdem das Bild die richtige laenge hat, koennen wir die noetigen
Schritte zur darstellung durch den Computer besprechen...
So, gehen wir mal durch was der Amiga wissen muss...
1. Modus des dargestellten Bildes
Unter Modus versteht man ob Ham, Hi-Res, Lo-Res oder Interlace, zwischen
den 4 Modi koennen wir waehlen. Dazu dient das BPLcon0-register bei
$DFF100.
2. Anzahl der Planes
Zur einstellung der Planesanzahl benutzt man ebenfalls das BPLcon0
register.
Erstmal ein kleiner einschub zum Thema Raw-format und darstellung der
Farben und so.
Manche Computer haben Tolle Grafik Modi mit 32 oder 16 farben.
Man waehlt dann diesen modus aus und arbeitet darin, der noetige Platz im
speicher ist immer derselbe, egal ob ich jetzt alle 16 oder nur Zwei farben
brauche.
Beim Amiga ist es anders...wir koennen in Jedem der Obengenannten Modi,
noch die Anzahl der Planes eingeben, diese bestimmt dann die Anzahl der
Farben.
1 Plane = 2 Farben
2 Planes = 4 Farben
3 Planes = 8 Farben
4 Planes = 16 Farben
5 Planes = 32 Farben
6 Planes = 64 Farben (allerdings Extra-Half-Bright modus)
Man kann sich so sein Bild nach bedarf reservieren, nach dem Motto, Warum
soll ich fuer 32 Farben platz machen wenn ich nur 4 brauche.
Also, das mit den Planes sieht so aus..es sind die Vollen 320*256 Bits, mit
denen wir auch gemalt haben (ich beziehe das jetzt erstmal auf das Bild
was ihr malen solltet). Da gibt es nur Punkt gesetzt oder nicht gesetzt.
Also zwei kombinationen. Wenn ich von Oben auf so eine Plane gucke dann
sehe ich nur 0 oder 1, also zwei Farben.
Jetzt kommt eine Zweite Plane ins spiel. Der Amiga stellt diese dann genau
unter der Ersten dar. Wenn ich jetzt auf ein Bit gucke,gibt es ja 4
kombinationen, also auch vier Farben, 00 01 10 11, sind die Kombinationen.
Wenn ihr jetzt halt 5 Planes habt dann habt ihr auch 32 Kombinationen.
Die Kombinationen, geben als Bitkombination immer einen Wert, und der wert
stellt dann die farben dar. Also bei 2 Planes wuerde die Kombi.. 10, die
Zweite farbe darstellen, welche das ist muss man dem Programmierer
Ueberlassen, den Farben kann man setzen wie man will, wenn man erstmal den
Copper in seiner Hand hat.
Nach dem Wir jetzt Modus und farbenanzahl gewaehlt haben, muessen wir dem
Amiga noch sagen wie gross unser Bild ist. Da der Amiga den Ganzen
Bildschirm als Grafikbildschirm benutzen kann muessen wir das Fenster, auch
genannt `Playfield` fuer das bild ermitteln.
Dazu geben wir ecken oben Links, und unten rechts an, und wieviel vom
linken rand die darstellung anfaengt und wieviel vom Rechten Rand sie
aufhoert.
Die werte fuer unser Bild...Pal sind
DiwStrt = $3081
DiwStop = $30c1
Ddfstrt = $0038
Ddfstop = $00d0
Und ins Bitplane-Controll-registern (BPLcon0)
Kommt $1200
1 fuer eine Plane, und die 2 steht fuer Lores...
Mehr im Naechsten Teil....
So long
Jeff Kandle